<?php

/**
 * 功能 : 终止程序运行并输出一段消息
 * @param $msg 文本类型的消息内容
 */
function pgExit($msg = ''){exit($msg);}


function p($var, $type = false){
    if($type){ echo "<pre>"; var_dump($var);echo "</pre>";}else{echo "<pre>";print_r($var);echo "</pre>";}
}

/**
 * 获取 cookie
 * @param $name cookie 名称
 * @return 具体 cookie 值或 null
 */
function pgGetCookie($name){if(isset($_COOKIE[$name])){return $_COOKIE[$name];} return null;}

/**
 * 删除指定 cookie
 * @param $name cookie 名称
 */
function pgRemoveCookie($name){
    setcookie($name, 'null', time() - 1000, '/');
}

/**
 * 获取 token [ cookie 模式 ]，并销毁
 * @return 具体的值或者null
 */
function getToken(){
    $token = pgGetCookie('__gracetoken__');
    pgRemoveCookie('__gracetoken__');
    return $token;
}

/**
 * 功能 : 工具实例化函数( 适用于不能使用命名空间的工具类 )
 * @param $args 动态参数
 * @return 对应的工具对象
 */
function tool($args){
    static $staticTools = array();
    $arguments = func_get_args();
    $className = array_shift($arguments);
    $className = '\\'.$className;
    if(empty($staticTools[$className])){
        $fileUri = PG_IN.PG_TOOLS.PG_DS.$className.'.php';
        if(!is_file($fileUri)){throw new graceException("类文件 {$className} 不存在");}
        include $fileUri;
        $staticTools[$className] = 1;
    }
    switch(count($arguments)){
        case 0 :
            return new $className();
            break;
        case 1 :
            return new $className($arguments[0]);
            break;
        case 2 :
            return new $className($arguments[0], $arguments[1]);
            break;
        case 3 :
            return new $className($arguments[0], $arguments[1], $arguments[2]);
            break;
        case 4 :
            return new $className($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
            break;
        case 5 :
            return new $className($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4]);
            break;
    }
}

function getFileUri($args){
    static $staticTools = array();
    $arguments = func_get_args();
    $className = array_shift($arguments);
    $className = '\\'.$className;
    if(empty($staticTools[$className])){
        $fileUri = PG_IN.PG_TOOLS.PG_DS.$className.'.php';
        if(!is_file($fileUri)){throw new graceException("类文件 {$className} 不存在");}
        return $fileUri;
    }
}


function getModelUri($args){
    $arguments = func_get_args();
    $className = array_shift($arguments);
    $className = '\\'.$className;
    $fileUri = PG_IN.'../model/'.$className.'.class.php';
    if(!is_file($fileUri)){throw new graceException("类文件 {$className} 不存在");die;}
    return $fileUri;
}



class graceException extends Exception{
    public function showBug(){if(PG_DEBUG){include PG_IN.'templates'.PG_DS.'debug.php';}}
}

function redis($args)
{
    static $staticTools = array();
    $arguments = func_get_args();
    $className = array_shift($arguments);
    if (empty($staticTools[$className])) {
        $fileUri = PG_IN . 'caches/' . $className . '.php';
        if (!is_file($fileUri)) {
            throw new graceException("缓存类 {$className} 不存在");
        }
        include $fileUri;
        $staticTools[$className] = 1;
    }
    $conf = array('type'=>'redis','host'=> '127.0.0.1','password'=> '','port' => '6379','pre'=> 'medoo_');
    return new $className($conf);
}

function memcache($args){
    static $staticTools = array();
    $arguments = func_get_args();
    $className = array_shift($arguments);
    if (empty($staticTools[$className])) {
        $fileUri = PG_IN . 'caches/' . $className . '.php';
        if (!is_file($fileUri)) {
            throw new graceException("缓存类 {$className} 不存在");
        }
        include $fileUri;
        $staticTools[$className] = 1;
    }
    $conf = array('type'=>'memcache','host'=> '127.0.0.1','password'=> '','port' => '11211','pre'=> 'medoo_');
    return new $className($conf);
}


function fileCach($args){
    static $staticTools = array();
    $arguments = func_get_args();
    $className = array_shift($arguments);
    if (empty($staticTools[$className])) {
        $fileUri = PG_IN . 'caches/' . $className . '.php';
        if (!is_file($fileUri)) {
            throw new graceException("缓存类 {$className} 不存在");
        }
        include $fileUri;
        $staticTools[$className] = 1;
    }
    $conf = array('type'=>'file','pre'=> 'medoo_');
    return new $className($conf);
}


/**
 * 时间、内存开销计算
 * @return array(耗时[毫秒], 消耗内存[K])
 */
function pgCost(){
    return array(
        round((microtime(true) - PG_START_TIME) * 1000, 2),
        round((memory_get_usage() - PG_START_MEMORY) / 1024, 2)
    );
}

/**
 * 开启 session
 */
function startSession(){
    switch(PG_SESSION_TYPE){
        case 'file' :
            if(!is_dir(PG_SESSION_DIR)){mkdir(PG_SESSION_DIR, 0777, true);}
            session_save_path(PG_SESSION_DIR);
            break;
        case 'memcache' :
            ini_set("session.save_handler", "memcache");
            ini_set("session.save_path", PG_SESSION_HOST);
            break;
        case 'redis':
            ini_set("session.save_handler", "redis");
            ini_set("session.save_path", PG_SESSION_HOST);
            break;
        default:
            if(!is_dir(PG_SESSION_DIR)){mkdir(PG_SESSION_DIR, 0777, true);}
            session_save_path(PG_SESSION_DIR);
    }
    session_start();
    session_write_close();
}

/**
 * 设置 session
 * @param $name session 名称
 * @param $val  对应的值
 */
function setSession($name, $val){
    session_start();
    if(is_array($val)){
        foreach($val as $k => $v){$_SESSION[$k] = $v;}
    }else{
        $_SESSION[$name] = $val;
    }
    session_write_close();
}

/**
 * 获取 session
 * @param $name session 名称
 */
function getSession($name){
    if(isset($_SESSION[$name])){return $_SESSION[$name];}
    return null;
}

/**
 * 销毁指定的 session
 * @param $name session 名称
 */
function removeSession($name){
    session_start();
    if(is_array($name)){
        foreach($name as $k){
            if(isset($_SESSION[$k])){unset($_SESSION[$k]);}
        }
    }else{
        if(isset($_SESSION[$name])){unset($_SESSION[$name]);}
    }
    session_write_close();
}

/**
 * 设置 cookie
 * @param $name   cookie 名称
 * @param $val    对应的值
 * @param $expire 有效时间
 */
function pgSetCookie($name, $val, $expire = 31536000){
    $expire += time();
    @setcookie($name, $val, $expire, '/');
    $_COOKIE[$name] = $val;
}

/**
 * 获取语言
 * @param $key 语言包键名称
 * @return 具体的值或者null
 */
function lang($key){
    static $Lang = null;
    if(is_null($Lang)){
        $langName = empty($_COOKIE['phpGraceLang']) ? 'zh' : $_COOKIE['phpGraceLang'];
        $langFile = '/'.PG_LANG_PACKAGE.'/'.$langName.'.php';
        if(is_file($langFile)){
            $Lang = require $langFile;
        }else{
            throw new graceException('语言包文件不存在');
        }
    }
    if(isset($Lang[$key])){return $Lang[$key];}
    return null;
}

/**
 * 生成一个 token [ cookie 模式 ]
 * @return 具体的值或者null
 */
function setToken(){
    $token = uniqid();
    pgSetCookie('__gracetoken__', $token);
    return $token;
}


/**
 * 去除空白字符
 * @param $str 需要替换的字符串
 * @return     替换后的结果
 */
function trimAll($str){
    $qian=array(" ","　","\t","\n","\r");
    $hou=array("","","","","");
    return str_replace($qian,$hou,$str);
}

/**
 * 输出 option 选中状态
 * @param $val1 比对值1
 * @param $val2 比对值2
 */
function isSelected($val1, $val2){if($val1 == $val2){echo ' selected="selected"';}}

/**
 * 将数值转换为 select 菜单的 option
 * @param $data      数据数组
 * @param $currentId 默认选项对应的键
 */
function dataToOption($data, $currentId = 0){
    foreach($data as $k => $v){
        if($currentId == $k){
            echo "<option value=\"{$k}\" selected=\"selected\">{$v}</option>".PHP_EOL;
        }else{
            echo "<option value=\"{$k}\">{$v}</option>".PHP_EOL;
        }
    }
}

/**
 * 规划缓存命名
 * @param $name      缓存名称
 * @param $parameter 缓存影响参数
 * @param $isSuper   是否为全局缓存
 * @return 缓存名称
 */
function graceCacheName($name, $parameter = '', $isSuper = true){
    $cacheConfig = sc('cache');
    $parameter   = is_array($parameter) ? implode('_', $parameter) : $parameter;
    $cacheName   = $isSuper ? $cacheConfig['pre'].$name.$parameter : $cacheConfig['pre'].PG_C.'_'.PG_M.'_'.$name.$parameter;
    if(empty($cacheConfig['name2md5'])){ return $cacheName; }
    return md5($cacheName);
}

//分页插件

function getPagestr($model,$table,$where,$page=1,$page_size=10){
     require_once getFileUri('page');
     $totle  = $model->count($table,$where);
     $p=new page($totle, 5 ,$page,$page_size);
     $pageDom='<div class="grace-pager">';
     $pageDom.=$p->showPages();
     $pageDom.='</div>';
     return $pageDom;
}




//列表生成
function getTable($arrTh, $arrTr,$url){
    $s = '<table class="layui-table">';
    $s .= '<thead>';
    //生成table表头
    for($i=0,$m=count($arrTh); $i<$m; $i++) {
        $s .= '<th>' . $arrTh[$i] . '</th>';
    }
    $s.= '<th>操作</th>';
    $s .= '</thead>';
    $s .= '<tbody>';
    //判断是否存在数据
    if($arrTr){
        //循环输出每行的tr
        for($i=0,$k=count($arrTr); $i<$k; $i++) {
            $s .= '<tr>';
            //循环输出每行的td内容
            foreach($arrTr[$i] as $j=>$n) {
                $s .= '<td>' . $n . '</td>';
            }
            $s .= '<td><a class="edit" href="javascript:;" data-url="'.$url[0].'"><i class="layui-icon layui-icon-edit" style="font-size: 30px; color: green;"></i></a>';
            $s .= '<a class="del" href="javascript:;"  data-url="'.$url[1].'""><i class="layui-icon layui-icon-delete" style="font-size: 30px; color: #1E9FFF;"></i></a></td>';
            $s .= '</tr>';
        }
    }else{//不存在数据输出“暂无信息”
        $s .= '<tr>';
        $s .= '<td style="text-align:center;" colspan="' . $m . '">暂无信息</td>';
        $s .= '</tr>';
    }
    $s .= '</tbody>';
    $s .= '</table>';
    return $s;
}






